#ifndef ODB_MESSAGE_HXX
#define ODB_MESSAGE_HXX

#include <boost/date_time/posix_time/posix_time.hpp>
#include <odb/core.hxx>
#include <odb/nullable.hxx>
#include <string>

namespace chat {
#pragma db object table("message")
class Message {
   public:
    Message() = default;
    Message(const std::string& message_id, const std::string& chat_session_id,
            const std::string& user_id,
            const boost::posix_time::ptime& created_time,
            const signed char message_type)
        : message_id_(message_id),
          chat_session_id_(chat_session_id),
          user_id_(user_id),
          created_time_(created_time),
          message_type_(message_type) {}

    void message_id(const std::string& message_id) { message_id_ = message_id; }
    const std::string& message_id() const { return message_id_; }

    void chat_session_id(const std::string& chat_session_id) {
        chat_session_id_ = chat_session_id;
    }
    const std::string& chat_session_id() const { return chat_session_id_; }

    void user_id(const std::string& user_id) { user_id_ = user_id; }
    const std::string& user_id() const { return user_id_; }

    void created_time(const boost::posix_time::ptime created_time) {
        created_time_ = created_time;
    }
    const boost::posix_time::ptime created_time() const {
        return created_time_;
    }

    void message_type(const signed char message_type) {
        message_type_ = message_type;
    }
    const signed char message_type() const { return message_type_; }

    void message_content(const std::string& message_content) {
        message_content_ = message_content;
    }
    const odb::nullable<std::string> message_content() const {
        return message_content_;
    }

    void file_id(const std::string& file_id) { file_id_ = file_id; }
    const odb::nullable<std::string> file_id() const { return file_id_; }

    void file_size(const unsigned long file_size) { file_size_ = file_size; }
    const odb::nullable<unsigned long> file_size() const { return file_size_; }

    void file_name(const std::string& file_name) { file_name_ = file_name; }
    const odb::nullable<std::string> file_name() const { return file_name_; }

   private:
    friend class odb::access;

/**********每条消息必须包含的内容************/
#pragma db id auto
    unsigned long id_;
#pragma db type("VARCHAR(64)") index unique
    std::string message_id_;  // 消息id
#pragma db type("VARCHAR(64)")
    std::string chat_session_id_;  // 消息所属的会话id
#pragma db type("VARCHAR(64)")
    std::string user_id_;  // 发布消息的用户id
#pragma db type("TIMESTAMP")
    boost::posix_time::ptime created_time_;  // 消息产生时间
    signed char message_type_;  // 消息类型(0-文本 1-图片 2-文件 3-语音)

    /**********非必须包含的内容************/
    odb::nullable<std::string> message_content_;  // 内容，只存储文本数据
#pragma db type("VARCHAR(64)")
    odb::nullable<std::string> file_id_;      // 文件id，只用于非文本消息
    odb::nullable<unsigned long> file_size_;  // 文件大小
#pragma db type("VARCHAR(64)")
    odb::nullable<std::string> file_name_;  // 文件名称
};
using MessagePtr = std::shared_ptr<Message>;
}  // namespace chat

#endif  // ODB_MESSAGE_HXX